package cn.good.yan.service.t2;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

/**
 * 2. CompletableFuture 定义操作 - 异步任务
 * 异步回掉 - thenCombine ： A任务 和 B任务 都执行完，再执行这里的逻辑，获取上面的任务的 返回值
 *
 * @author shengren.yan
 * @create 2024-03-25
 */
public class CompletableFuture7 {
    public static void main(String[] args) {
        // A 任务，执行逻辑，返回值：10  （代码运行1秒）
        CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "【A】--子线程 - 任务正在执行");
            //暂停几秒钟线程
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 10;
        });
        // B 任务，执行逻辑，返回值：20  （代码运行2秒）
        CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "【B】--子线程 - 任务正在执行");
            //暂停几秒钟线程
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 20;
        });
        // A任务、B任务 都执行完，再执行这里，（参数：是前面的参数，返回值：是最终的结
        CompletableFuture<Integer> result = completableFuture1.thenCombine(completableFuture2, (x, y) -> {
            System.out.println("-----开始两个结果合并");
            return x + y;
        });
        // 最终的返回结果，result的
        System.out.println(result.join());

    }
}
